#include "MyRobotPose.h"

using namespace dual;

namespace nlohmann {
	// RobotPose 没有默认构造函数，要采用下面的方式提供序列化和反序列化方法,否则json::get<uri>()不能调用
	template <>
	struct adl_serializer<RobotPose> {
		static void from_json(const json& j, RobotPose& p) {
			// 反序列化
			// 从json中获取std::string,调用MyRobotPose的构造函数
			// uri(std::string const &uri_text, scheme_category category = scheme_category::Hierarchical,
			// query_argument_separator separator = query_argument_separator::ampersand)
			// 将std::string转为MyRobotPose对象
			//return{ j.template get<std::string>() };
			//j = json{ {"Type", v.Type}, {"Value", v.Value} };
			
			j.at("Name").get_to(p.Name);
			j.at("Type").get_to(p.Type);
			j.at("Value").get_to(p.Value);
			
		}
		static void to_json(json& j, const RobotPose& p) {
			// 序列化
			// 调用 MyRobotPose::to_string()函数将MyRobotPose对象转为std::string保存到json
			//j = p.to_string();
			//return {  };
			j = json{ {"Name", p.Name}, {"Type", p.Type}, {"Value", p.Value}};
		}
	};

	// RobotPath 没有默认构造函数，要采用下面的方式提供序列化和反序列化方法,否则json::get<uri>()不能调用
	template <>
	struct adl_serializer<RobotPath> {
		static void from_json(const json& j, RobotPath& p) {
			// 反序列化
			// 从json中获取std::string,调用MyRobotPose的构造函数
			// uri(std::string const &uri_text, scheme_category category = scheme_category::Hierarchical,
			// query_argument_separator separator = query_argument_separator::ampersand)
			// 将std::string转为MyRobotPose对象
			//return{ j.template get<std::string>() };
			//j = json{ {"Type", v.Type}, {"Value", v.Value} };

			j.at("Type").get_to(p.Type);
			j.at("Value").get_to(p.Length);

			
			//return { json{ {"Type", p.Type}, {"Length", p.Length} } };
		}
		static void to_json(json& j, const RobotPath& p) {
			// 序列化
			// 调用 MyRobotPose::to_string()函数将MyRobotPose对象转为std::string保存到json
			//j = p.to_string();
			j = json{ {"Type", p.Type}, {"Length", p.Length} };
		}
	};
}





//DualRobotPath::DualRobotPath()
//{
//}
//
//DualRobotPath::~DualRobotPath()
//{
//}

//int save(const std::string& file)
//{
//    try
//    {
//        nlohmann::json json = { {"WorkFlow", WorkFlow}, {"IOTask", IOTask}, {"PresetPose", PresetPose}, {"RandomRadius", RandomRadius} };
//        std::ofstream(file) << json.dump(4);
//        return 0;
//    }
//    catch (const std::exception& ex)
//    {
//        HY_LOG_E("save workflow file {} catch exception: {}", file, ex.what());
//        return -1;
//    }
//}

int DualRobotPath::save(const std::string& file) const
{
    try
    {
        nlohmann::json json = { {"Path", path}};
        std::ofstream(file) << json.dump(0);
        return 0;
    }
    catch (const std::exception& ex)
    {
        //HY_LOG_E("save workflow file {} catch exception: {}", file, ex.what());
		std::cout << fmt::format("save workflow file {} catch exception: {}\n", file, ex.what());
        return -1;
    }
}

//int load(const std::string& file)
//{
//    try
//    {
//        nlohmann::json json;
//        std::ifstream(file) >> json;
//        json.at("Path").get_to(path);
//        /*json.at("IOTask").get_to(IOTask);
//        json.at("PresetPose").get_to(PresetPose);
//        json.at("RandomRadius").get_to(RandomRadius);*/
//
//        return 0;
//    }
//    catch (const std::exception& ex)
//    {
//        //HY_LOG_E("load workflow file {} catch exception: {}", file, ex.what());
//		std::cout << fmt::format("load workflow file {} catch exception: {}\n", file, ex.what());
//        return -1;
//    }
//}

int DualRobotPath::load(const std::string& file)
{
	try
	{
		nlohmann::json json;
		std::ifstream(file) >> json;
		json.at("Path").get_to(path);
		/*json.at("IOTask").get_to(IOTask);
		json.at("PresetPose").get_to(PresetPose);
		json.at("RandomRadius").get_to(RandomRadius);*/

		return 0;
	}
	catch (const std::exception& ex)
	{
		//HY_LOG_E("load workflow file {} catch exception: {}", file, ex.what());
		std::cout << fmt::format("load workflow file {} catch exception: {}\n", file, ex.what());
		return -1;
	}
}
